RubyKaigi 2024
Day 1
tompng
Writing Weird Code
TRICK
アニメーションするQuine
記号の繰り返し
4n+3 % はvalid
正規表現のパースで文法エラー
ローカル変数に代入される
ヒアドキュメント
変数名に絵文字を使えるが、四角で囲まれた数字の絵文字は文法エラー
正規表現で素数判定
クラス変数のlookup
ひとりTRICK
Most Floral
BMP画像かつRubyスクリプト
デコーダーを画像内に隠す
Most Fresh
動画になる
ruby.wasm
プログラムをアスキーアート化する
モンキーパッチ
Most Wavy
アニメーションQuine
Most Dangerous
ハブクラゲ
マウスクリックに反応する
BEGIN ブロック内で method_missing を定義する
線形方程式を解く
Ractor
Pofiler
Most Kaigi-ish
irbrc
Reline::Face
Most Eternal
ミンサ
末永く
かねこさん
(途中からみはじめた)
パーサー
Lrama
BisonではRubyの文法をカバーできない
Error-tolerant parserの需要
Rubyのlexerには状態がある
parserとlexerを疎結合にした結果、むしろ複雑になっている
RubyのパーサーはRubyの機能に依存している
universal parserを使う側のトークがday 2にある
ロードマップ
モリスさん
namespace
モチベーション
衝突回避
モジュラモノリス
モジュールのインスタンスがただ1つ
バージョン衝突
依存地獄
dl_openは同じライブラリを複数回読み込めない
無視される
ファイル名を変えて迂回
モンキーパッチの影響をnamespace内にとどめたい
今後
モジュラモノリスのデプロイ
依存地獄からの脱出
export
いまいずみさん
irb
色付け
コードの評価
Reline
表示
ダイアログ
カーソル
GNU readlineとの互換をめざす
コマンドラインエディタ
カーソル位置を移動する
libedit
Relineの優位性
プロンプト
複数行入力
Rubyで拡張できる
readline-extがデフォルトgemじゃなくなった
.inputrc
重要度の高いものからやりたい
内部実装
undoの実装
ささださん
Ractorの改善
オブジェクトの共有をしないことで固有のバグを防ぐ
制約が強い
子Ractorから親Ractorの定数にアクセスできない
子からrequireできない
パフォーマンス的に不利
メインスレッドで式を評価する
Ractor#interrupt_exec
実行完了を待たない
↑を使ってRactorでのrequireを実装できる
Kernel#requireがオーバーロードされていることがある
prependすると子クラスの祖先に含まれる
Kernelなので
ネイティブのタイマースレッド
GCのパフォーマンス
Ractor向きのGCのチューニング
Day 2
キーノート
リアルタイムWebアプリケーション
BBS
BBSゲーム
インタラクティブ
2005年にRails誕生
HTML5 + WebSocket
2017 Async gem
非同期処理いろいろ
falcon
Railsでリアルタイムゲーム
importmap
Flappy Birdを作るデモ
テクノロジーは複雑
kateinoigakukunさん
ruby.wasm
RubyGemsサポート
Gem installerがまだ
on the flyでフェッチする
pre-installation
Mastodonをブラウザ上で動かす
pglite
C拡張のクロスコンパイル
ワークアラウンド不要になった
gem installがまだ
静的リンクだとCRubyのビルドプロセスと密結合になる
AOT 動的リンク
コンポーネントごとに共有ライブラリにする
Asyncifyを脱出したい
qnighyさん
YAML
psych-comments
ふつうにloadしてdumpするとコメントが消える
深淵
PsychはCライブラリを使っている
2パスのパーサー
mapが平坦なarrayで表現されている
YAMLのタグを活用する
濫用
コメントのほうがいい
スペース何個入れるか問題
ライブラリのスコープを絞る責任がある
うづらさん
mruby/edge
WebAssemblyについて
ランタイムを選ばないスタックマシン
wasm-objdump
WASI
スタブ
クロスランタイム
mruby/edgeはmrubyバイトコードを受理する
mruby互換のVMを作った
import/exportにはTypesが必要
Stringはバイト列
マーティンさん
AIによると昨日議論済
property名を正規表現に書けない
Unicode以前からある
名前→コードポイントの関数が必要
素朴にやるとサイズが大きい
trie
葉ノードを削る
決まり字
機械的に決まる名前
day 3
こくぶんさん
YJIT
クラスで分岐するオーバーヘッド
インライン展開してる?
例外処理
breakで返す値を変えられる
JITとインタプリタの割合があり、JITの割合を上げることで高速化できている
VMのレジスタにローカル変数の値を入れられる
メソッドのインライン展開
典型的なメソッドに対して最適化する
Sorbetにモンキーパッチ
実行時型検査をスキップ
CRubyのメソッドのインライン展開
lazy frame
アーロンさん
インスタンス変数の高速化
Ruby 3.3
赤黒木
Object Shapes
イミュータブルな赤黒木
要素を削除できない
インスタンス変数はオブジェクトの配列で保持される
クラスが違っても同じshapeを共有できる
親のノードを全部検査しないといけないのでO(n)
インラインキャッシュがある
サブクラスではキャッシュが効かないことがある
Shapeは削除されないので赤黒木が使える
yuryuさん
円周率の数値計算の世界記録
人類の計算の進歩は円周率とともにある
ストレージがボトルネック
分散コンピューティング
調整できるパラメータがいろいろ
y-cruncherの設定ファイルをいじるのにERBを使う
エスケープシーケンス入りでログが出る
正規表現でコネコネする
CSVにしたらスプレッドシートに突っ込める
Rubyが円周率計算の世界記録に導いてくれた
スーファミmruby
メガドライブでmrubyがきっかけ
画面出力
BGとスプライト
BGが多いほど使える色が減る
NTSC
VBlank
HBlank
ゲームループ
hal_write
コンソールがない
スーパーFXチップ
call_s_cpu
makenowjustさん
正規表現エンジンの自作
バックトラック型VM
「作って学ぶ正規表現エンジン」
正規表現をRubyにトランスパイルする
AST
Procに変換する
バックトラックできないのでこれでは駄目
スタックマシン
キャプチャ
空ループ問題
先読み